package objects;

import static objects.AdapletConstants.sNewLine;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import sections.ISection.Section;

public class RelToRel extends Relationship
{
	/**
	 * 
	 */
	private static final long serialVersionUID = -7124713580681804857L;
	private boolean fFromRel;
	private boolean fToRel;

	public RelToRel()
	{
		super();
		fFromRel = true;
		fToRel = true;
	}

	public boolean isFromRel()
	{
		return fFromRel;
	}

	public void setFromRel(boolean isFromRel)
	{
		fFromRel = isFromRel;
	}

	public boolean isToRel()
	{
		return fToRel;
	}

	public void setToRel(boolean isToRel)
	{
		fToRel = isToRel;
	}

	@Override
	public String toString()
	{
		return buildRelToRelDefinition();
	}

	public String buildRelToRelDefinition()
	{
		StringBuffer relToRelDef = new StringBuffer(500);

		relToRelDef.append(buildComment());

		// RelToRel
		relToRelDef.append("reltorel \"");
		relToRelDef.append(getRelationshipName());
		relToRelDef.append("\" {");
		relToRelDef.append(sNewLine);

		// Id
		relToRelDef.append("\tid ");
		relToRelDef.append(getTableName());
		relToRelDef.append("(");
		relToRelDef.append(getId());
		relToRelDef.append(")");
		if (isMapped())
		{
			relToRelDef.append(" mapped");
		}
		relToRelDef.append(";");
		relToRelDef.append(sNewLine);

		// Default Type
		String defaultType = getDefaultType();
		if (defaultType != null && !defaultType.isEmpty())
		{
			relToRelDef.append("\tdefault type \"");
			relToRelDef.append(defaultType);
			relToRelDef.append("\";");
			relToRelDef.append(sNewLine);
		}

		// From
		relToRelDef.append("\tfrom");
		if (fFromRel)
		{
			relToRelDef.append(" relationship ");
		}
		else
		{
			relToRelDef.append(" businessobject ");
		}
		relToRelDef.append("\"");
		relToRelDef.append(getFromType());
		relToRelDef.append("\" in ");
		relToRelDef.append(getTableName());
		relToRelDef.append("(");
		relToRelDef.append(getFromId());
		relToRelDef.append(");");
		relToRelDef.append(sNewLine);

		// To
		relToRelDef.append("\tto");
		if (fToRel)
		{
			relToRelDef.append(" relationship ");
		}
		else
		{
			relToRelDef.append(" businessobject ");
		}
		relToRelDef.append("\"");
		relToRelDef.append(getToType());
		relToRelDef.append("\" in ");
		relToRelDef.append(getTableName());
		relToRelDef.append("(");
		relToRelDef.append(getToId());
		relToRelDef.append(");");
		relToRelDef.append(sNewLine);

		// Attributes
		for (String attrName : getAttributeList())
		{
			String columnName = getAttributeColumn(attrName);

			relToRelDef.append("\tattribute \"");
			relToRelDef.append(attrName);
			relToRelDef.append("\" ");
			relToRelDef.append(columnName);
			relToRelDef.append(";");
			relToRelDef.append(sNewLine);
		}

		relToRelDef.append("}");
		relToRelDef.append(sNewLine);

		return relToRelDef.toString();
	}

	@Override
	public Section getSectionType()
	{
		return Section.REL_TO_REL;
	}

	private void readObject(ObjectInputStream iStream) throws IOException, ClassNotFoundException
	{
		iStream.defaultReadObject();
		validateState();
	}

	private void writeObject(ObjectOutputStream oStream) throws IOException
	{
		oStream.defaultWriteObject();
	}

	private void validateState()
	{
		// TODO
	}

}
